package java学习.leetcode.editor.cn;

import java学习.实训.day08.Int;

import java.util.Arrays;

/**
 * @author 刘世锦
 * 2022-10-15 00:27:01	 当前时间
 */
//给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。 
//
// 
// 如果剩余字符少于 k 个，则将剩余字符全部反转。 
// 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "abcdefg", k = 2
//输出："bacdfeg"
// 
//
// 示例 2： 
//
// 
//输入：s = "abcd", k = 2
//输出："bacd"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 104 
// s 仅由小写英文组成 
// 1 <= k <= 104 
// 
// Related Topics 双指针 字符串 
// 👍 365 👎 0

public class 反转字符串II{
	public static void main(String[] args) {
		Solution solution = new 反转字符串II().new Solution();
		String s = "abcdefg";int k = 2;
		System.out.println(solution.reverseStr(s, k));
//		solution.reverseString(s.toCharArray(),2,4);
	}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
//		    0 1 2 3 4 5 6
//输入：s = "a b c d e f g", k = 2
//	        b a c d f e g
	/**
	 *      start = 2  end = 5  len = 4
	 *      c
	 *
	 */
//输出："bacdfeg"
//	每隔k个反转k个，末尾不够k个时全部反转；
    public String reverseStr(String s, int k) {
		char[] chars = s.toCharArray();
		for (int i = 0; i < s.length(); i+=2*k) {
			// 反转 0，k
			//此时可能会出现 k+i>chars.length的情况，需要考虑到
			// 可以简化 成一行 ：reverseString(chars,i,Math.min(chars.length-1,k+i-1));
			if (k+i>s.length()){
				reverseString(chars,i,s.length()-1);
			}else{
				reverseString(chars,i,k+i-1);
			}
		}

		return new String(chars);
	}
//	 反转指定范围的字符串
	public void reverseString(char[] s,int start,int end) {
    	while (start<end){
//			char temp = s[start];
//			s[start] = s[end];
//			s[end] = temp;
			s[start] = (char) (s[start] ^ s[end]);
			s[end]  = (char) (s[start]^s[end]);
			s[start] = (char) (s[start] ^ s[end]);
			start++;
			end--;
		}
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
